#pragma once

#include <string>
#include <memory>
#include "redis_manager.hpp"
#include "session.hpp"

/**
 * @brief 会话管理类，使用单例模式
 * 
 * 该类负责处理所有会话相关的业务逻辑，包括：
 * - 会话的创建和验证
 * - 会话的过期处理
 * - 会话统计和管理
 */
class SessionManager {
public:
    /**
     * @brief 获取SessionManager单例实例
     * @return SessionManager& 会话管理器的单例引用
     */
    static SessionManager& getInstance();

    /**
     * @brief 创建用户会话
     * @param userId 用户ID
     * @param expirySeconds 过期时间（秒），默认1小时
     * @return std::shared_ptr<Session> 创建的会话对象，如果创建失败则返回nullptr
     */
    std::shared_ptr<Session> createSession(int userId, int expirySeconds = 3600);

    /**
     * @brief 验证会话并获取会话对象
     * @param token 会话令牌
     * @return std::shared_ptr<Session> 会话对象，如果会话无效则返回nullptr
     */
    std::shared_ptr<Session> validateSession(const std::string& token);

    /**
     * @brief 删除用户会话
     * @param token 会话令牌
     * @return bool 删除是否成功
     */
    bool deleteSession(const std::string& token);

private:
    // 私有构造函数，防止外部实例化
    SessionManager() = default;
    ~SessionManager() = default;
    // 删除拷贝构造和赋值操作符，确保单例
    SessionManager(const SessionManager&) = delete;
    SessionManager& operator=(const SessionManager&) = delete;

    /**
     * @brief 生成会话令牌
     * @return std::string 生成的会话令牌
     */
    std::string generateToken();
}; 